package stream;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author deity
 * @version 1.0
 * @date 2020/11/8 22:19
 */
public class StreamApp3 {

    public static void main(String[] args) {

        /**
         * 1-Stream中常见的API操作
         */
        List<String> accountList = Arrays.asList("鬼片","僵尸片","激情片","动作片","科幻片","动画片","喜剧片");

        //map() 中间操作,map() 方法接收一个Function接口
        accountList = accountList.stream().map(x->"我看过:"+x).collect(Collectors.toList());

        //filter() 添加过滤条件,过滤符合条件的用户
        accountList = accountList.stream().filter(x->x.length()>6).collect(Collectors.toList());

        //forEach 增强型循环
        accountList.forEach(x->System.out.println("forEach->"+x));

        // peek()中间操作,迭代数据完成数据的依次处理过程
        accountList.stream()
                .peek(x->System.out.println("peek 1:"+x))
                .peek(x->System.out.println("peek 2:"+x))
                .forEach(System.out::println);

        accountList.forEach(System.out::println);


        /**
         * 2-Stream中对于数字运算的支持
         */
        List<Integer> intList = Arrays.asList(10,20,30,40,50,60,70,80,90);
        // skip() 中间操作，有状态，跳过部分数据
        intList.stream().skip(3).forEach(System.out::println);
        System.out.println("------------------------------------------------");

        // limit()中间操作，有状态，限制输出数据量
        intList.stream().skip(3).limit(2).forEach(System.out::println);
        System.out.println("------------------------------------------------");

        // distinct() 中间操作，有状态，剔除重复数据
        intList.stream().distinct().forEach(System.out::println);
        System.out.println("------------------------------------------------");


        // max() 获取最大值
        Optional optional = intList.stream().max((x,y)->x-y);
        System.out.println("max="+optional.get());
        System.out.println("------------------------------------------------");
        // min() 获取最小值

        // reduce() 合并处理数据 -->类似于sum
        Optional optional1 =intList.stream().reduce((sum,x)->sum+x);
        System.out.println("reduce="+optional1.get());
        System.out.println("------------------------------------------------");

    }
}
